#include "SymboleValue.h"
#include <stdlib.h>

////////////////////////////////////////////////////////////////////////////////
SymboleValue::SymboleValue(Symbole s) :
	Symbole(s.getChaine()) {
	if (s == "<ENTIER>") {
		//valeur = atoi(s.getChaine().c_str()); // c_str convertit une string en char*
		setValeur( atoi( s.getChaine().c_str() ) );
		defini = true;
	}
	else if (s == "<CHAINE>") {
		//valeur = atoi(s.getChaine().c_str()); // c_str convertit une string en char*
		setValeur(s.getChaine());
		defini = true;
	}
	else {
		setValeur(0);
		defini = false;
	}
}

////////////////////////////////////////////////////////////////////////////////
void SymboleValue::afficher(unsigned short indentation) {
	Noeud::afficher(indentation);
	cout << "Feuille - Symbole value : " << getChaine() << endl; // on affiche la chaine du symbole
}

////////////////////////////////////////////////////////////////////////////////
// Attention : cette fonction (operator) n'est pas membre de la classe SymboleValue
ostream & operator <<(ostream & cout, SymboleValue symb) {
	cout << (Symbole) symb << "\t\t - Valeur=";
	if (symb.defini)
		{
			if(typeid(*symb.getValeur()) == typeid(TypeInt))
			{
				TypeInt* val = dynamic_cast<TypeInt*> (symb.getValeur());
				cout << val->getValeur() << " ";
			}
			else if(typeid(*symb.getValeur()) == typeid(TypeString))
			{
				TypeString* val = dynamic_cast<TypeString*> (symb.getValeur());
				cout << val->getValeur() << " ";
			}
		}
	else
		cout << "indefinie ";
	return cout;
}
